package com.example.mq.mqserver.core;

import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * 表示一个消息
 */
@Data
public class Message implements Serializable {
    // 消息的属性
    private BasicProperties basicProperties = new BasicProperties();
    // 消息正文
    private byte[] body;
    // 下面三个属性，是为了方便文件中存储消息
    // 表示消息存储在文件中的具体位置（字节），[offsetBeg, offsetEnd)
    // 这两个属性不需要存入文件中，加上 transient 不需要序列化
    private transient long offsetBeg;
    private transient long offsetEnd;
    // 表示这个消息是否有效（消息）0x1 有效，0x0 无效
    private byte isValid = 0x1;


    // 封装一个创建消息对象的工厂方法
    // 这个方法创建消息对象时，给 messageId 设置一个 UUID
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body) {
        Message message = new Message();
        if (basicProperties != null) {
            message.setBasicProperties(basicProperties);
        }
        message.setMessageId("M-" + UUID.randomUUID());
        // basicProperties 就算有 routingKey 了，还是现在传入的 routingKey 为准
        message.basicProperties.setRoutingKey(routingKey);
        message.body = body;
        return message;
    }


    // 封装 BasicProperties 中属性的 getter 和 setter
    public String getMessageId() {
        return basicProperties.getMessageId();
    }
    public void setMessageId(String messageId) {
        basicProperties.setMessageId(messageId);
    }
    public String getRoutingKey() {
        return basicProperties.getRoutingKey();
    }
    public void setRoutingKey(String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }
    public int getDeliverMode() {
        return basicProperties.getDeliverMode();
    }
    public void setDeliverMode(int deliverMode) {
        basicProperties.setDeliverMode(deliverMode);
    }
}
